GPSBabelGUI-2: Bug fixes and improvements from Jan Peter Stotz.
authoroliskoli <oliskoli>
Sat, 19 Jul 2008 19:52:09 +0000 (19:52 +0000)
committeroliskoli <oliskoli>
Sat, 19 Jul 2008 19:52:09 +0000 (19:52 +0000)
win32/GPSBabelGUI.exe
win32/gui-2/GPSBabelGUI.dof
win32/gui-2/GPSBabelGUI.res
win32/gui-2/common.pas
win32/gui-2/delphi.pas
win32/gui-2/main.dfm
win32/gui-2/main.pas
win32/gui-2/options.pas

index e4c6bd3e708eed9464013765aec9be4adc33cc87..3f119edefd8b1c324083a4db759b48ca47166251 100644 (file)
Binary files a/win32/GPSBabelGUI.exe and b/win32/GPSBabelGUI.exe differ
index a1981ffe95ecca339b918cb7c053d97581716379..b5c809b6a14b4f21bc20c847603426f399a9a0c8 100644 (file)
@@ -56,7 +56,7 @@ IncludeVerInfo=1
 AutoIncBuild=0\r
 MajorVer=0\r
 MinorVer=2\r
-Release=15\r
+Release=16\r
 Build=0\r
 Debug=0\r
 PreRelease=0\r
@@ -68,7 +68,7 @@ CodePage=1252
 [Version Info Keys]\r
 CompanyName=GPSBabel Makers\r
 FileDescription=GPSBabel Windows Frontend\r
-FileVersion=0.2.15.0\r
+FileVersion=0.2.16.0\r
 InternalName=\r
 LegalCopyright=(C) 2005-2008 Olaf Klein (o.b.klein@gpsbabel.org)\r
 LegalTrademarks=\r
index ce791d526d9c02f1bf8f3ba8322062bac10449a4..c86993a01ee216c1c28d91ee28e08054aeeb10d3 100644 (file)
Binary files a/win32/gui-2/GPSBabelGUI.res and b/win32/gui-2/GPSBabelGUI.res differ
index 352485aae5326cda134b69afb6b19f8324a0a0a3..9303350c33a30f02a859a3be6a57a86536bea2fe 100644 (file)
@@ -21,7 +21,7 @@ unit common;
 interface\r
 \r
 uses\r
-  Windows, SysUtils, Classes, Messages, Controls, StdCtrls;\r
+  Windows, SysUtils, Classes, Messages, Controls, StdCtrls, ExtCtrls;\r
 \r
 const\r
   OTypes: array[0..6] of PChar =\r
@@ -70,9 +70,14 @@ const
   SREG_SOURCE_FILE = 'Source:File';\r
 \r
   SREG_GLOBAL_LANG = 'Global:Language';\r
-  \r
+\r
+  SREG_MAIN_LAYOUT = 'Main:Layout';\r
+  SREG_MAIN_WAYPOINTS = 'Main:Waypoints';\r
+  SREG_MAIN_ROUTES    = 'Main:Routes';\r
+  SREG_MAIN_TRACKS    = 'Main:Tracks';\r
+\r
 const\r
-  Profile: array[0..12] of string =\r
+  Profile: array[0..15] of string =\r
   ('?',\r
    SREG_SOURCE_DIR,\r
    SREG_SOURCE_FMT,\r
@@ -85,22 +90,42 @@ const
    SREG_TARGET_FILE,\r
    SREG_SOURCE_FILE,\r
    SREG_GLOBAL_LANG,\r
-   'Main:Layout');\r
+   SREG_MAIN_LAYOUT,\r
+   SREG_MAIN_WAYPOINTS,\r
+   SREG_MAIN_ROUTES,\r
+   SREG_MAIN_TRACKS\r
+   );\r
 \r
 const\r
   GPSBabel_Domain = 'gpsbabel';\r
 \r
 type\r
-  PFileInfo = ^TFileInfo;\r
-  TFileInfo = record\r
-    Descr: string;\r
-    Ext:   string;\r
+  TCapability = class\r
+  protected\r
+    FName : String;\r
+    FDescription : string;\r
+    FExt:   string;\r
     internal: string;\r
+    Furl: PChar;\r
+  protected\r
+    function CanReadAny : Boolean;\r
+    function CanWriteAny : Boolean;\r
+    function FIsDevice : Boolean;\r
+    function FIsFile : Boolean;\r
+  public\r
     Capas: Integer;\r
-    url: PChar;\r
+    property Name : String read FName;\r
+    property Description : String read FDescription;\r
+    property Ext : String read FExt;\r
+    property ReadAny : Boolean read CanReadAny;\r
+    property WriteAny : Boolean read CanWriteAny;\r
+    property IsDevice : Boolean read FIsDevice;\r
+    property IsFile : Boolean read FIsFile;\r
   end;\r
 \r
 type\r
+  TOptionEdit = class;\r
+\r
   TOption = record\r
     format: string;\r
     name:   string;\r
@@ -108,16 +133,28 @@ type
     defname: string;\r
     otype:  Byte;\r
     def:    PChar;       // default value from gpsbabel or ini-file\r
-    gbdef:  PChar;       // default value from gpsbabel       \r
+    gbdef:  PChar;       // default value from gpsbabel\r
     min:    PChar;\r
     max:    PChar;\r
     chb:    TCheckBox;\r
-    edit:   TControl;\r
+    edit:   TOptionEdit;\r
     dir:    Byte;        // 1 = only in; 2 = only out\r
   end;\r
   POption = ^TOption;\r
 \r
-type\r
+  TOptionEdit = class(TObject)\r
+  protected\r
+    FOption : POption;\r
+    function GetValue : String; virtual; abstract;\r
+    procedure SetValue(Value : String); virtual; abstract;\r
+    function GetEnabled : Boolean; virtual; abstract;\r
+    procedure SetEnabled(Value : Boolean); virtual; abstract;\r
+  public\r
+    property Value : String read GetValue write SetValue;\r
+    property Option : POption read FOption;\r
+    property Enabled : Boolean read GetEnabled write SetEnabled;\r
+  end;\r
+\r
   TCapabilities = class;\r
   \r
   TOptions = class(TStringList)\r
@@ -130,8 +167,10 @@ type
     constructor Create(ACapabilities: TCapabilities);\r
     procedure AddOptionLine(const ALine: string);\r
     procedure DebugGetHints(List: TStringList);\r
-    function FormatOpts(const Descr: string): TStringList;\r
-    function HasFormatOpts(const Format: string): Boolean;\r
+    function FormatOpts(const Descr: string): TStringList; overload;\r
+    function FormatOpts(cap : TCapability): TStringList; overload;\r
+    function HasFormatOpts(const Format: string): Boolean; overload;\r
+    function HasFormatOpts(cap : TCapability): Boolean; overload;\r
   property\r
     List: TStrings read GetList write SetList;\r
   end;\r
@@ -143,16 +182,11 @@ type
     function GetList: TStrings;\r
     procedure SetList(const Value: TStrings);\r
   public\r
-    function CanReadAny(Index: Integer): Boolean;\r
-    function CanWriteAny(Index: Integer): Boolean;\r
-    function GetDescr(Index: Integer): string;\r
-    function GetExt(const Descr: string): string;\r
-    function GetCaps(const Descr: string): Integer;\r
-    function GetName(const Descr: string): string;\r
-    function IsDevice(Index: Integer): Boolean;\r
-    function IsFile(Index: Integer): Boolean;\r
-  property\r
-    List: TStrings read GetList write SetList;\r
+    function GetCapabilityByName(const Descr: string): TCapability;\r
+    function GetCapability(Index: Integer) : TCapability;\r
+\r
+    property List: TStrings read GetList write SetList;\r
+    property Capability[Index : Integer] : TCapability read GetCapability;\r
   end;\r
 \r
 type\r
@@ -344,9 +378,18 @@ function TOptions.FormatOpts(const Descr: string): TStringList;
 var\r
   i: Integer;\r
   s: string;\r
+  cap : TCapability;\r
 begin\r
-  s := FCaps.GetName(Descr);\r
-  if (s <> '') and Self.Find(s, i) then\r
+  cap:=FCaps.GetCapabilityByName(Descr);\r
+  result:=FormatOpts(cap);\r
+end;\r
+\r
+function TOptions.FormatOpts(cap : TCapability): TStringList;\r
+var\r
+  i: Integer;\r
+  s: string;\r
+begin\r
+  if (Assigned(Cap)) and Self.Find(Cap.Name, i) then\r
     Result := TStringList(Self.Objects[i])\r
   else\r
     Result := nil;\r
@@ -362,6 +405,11 @@ begin
   Result := (FormatOpts(Format) <> nil);\r
 end;\r
 \r
+function TOptions.HasFormatOpts(cap : TCapability): Boolean;\r
+begin\r
+  Result := (FormatOpts(cap) <> nil);\r
+end;\r
+\r
 procedure TOptions.SetList(const Value: TStrings);\r
 var\r
   i: Integer;\r
@@ -386,11 +434,12 @@ var
   name: string;\r
   internal: string;\r
   caps: Integer;\r
-  info: PFileInfo;\r
+  info: TCapability;\r
 \r
 begin\r
   StrPCopy(buff, Line);\r
   StrCat(buff, #9);\r
+  //OutputDebugString(buff);\r
 \r
   cin := @buff;\r
   index := 0;\r
@@ -410,38 +459,37 @@ begin
       1:\r
         scaps := StrPas(cin);\r
       2:\r
-          name := StrPas(cin);\r
+        name := StrPas(cin);\r
       3:\r
         ext := StrPas(cin);\r
-    else\r
-      begin\r
-        comment := StrPas(cin);\r
-        if (Length(comment) = 0) or (Length(name) = 0) then break;\r
-        \r
-//      if (comment[1] = '?') then break;\r
-        \r
-        caps := 0;\r
-        for i := 1 to Length(scaps) do\r
-          if (scaps[i] <> '-') then caps := caps or (1 shl (i - 1));\r
-\r
-         New(info);\r
-         info.Descr := comment;\r
-         info.Ext := ext;\r
-         info.internal := internal;\r
-         info.Capas := caps;\r
-\r
-         i := SELF.Add(name);\r
-         SELF.PutObject(i, Pointer(info));\r
-\r
-         if (name = 'garmin_txt') then\r
-         begin\r
-           gpsbabel_knows_inifile := True;\r
-           // add -p "" to command-line\r
-         end\r
-         else if (name = 'xcsv') then\r
-           info.internal := 'file';\r
-         break;\r
-       end;\r
+    else begin\r
+      comment := StrPas(cin);\r
+      if (Length(comment) = 0) or (Length(name) = 0) then break;\r
+\r
+//    if (comment[1] = '?') then break;\r
+\r
+      caps := 0;\r
+      for i := 1 to Length(scaps) do\r
+        if (scaps[i] <> '-') then caps := caps or (1 shl (i - 1));\r
+\r
+        info:=TCapability.Create;\r
+        info.FName:=name;\r
+        info.FDescription := comment;\r
+        info.FExt := ext;\r
+        info.internal := internal;\r
+        info.Capas := caps;\r
+\r
+        SELF.AddObject(name,info);\r
+\r
+        if (name = 'garmin_txt') then\r
+        begin\r
+          gpsbabel_knows_inifile := True;\r
+          // add -p "" to command-line\r
+        end\r
+        else if (name = 'xcsv') then\r
+          info.internal := 'file';\r
+        break;\r
+      end;\r
     end;\r
 \r
     index := index + 1;\r
@@ -449,62 +497,24 @@ begin
   end;\r
 end;\r
 \r
-function TCapabilities.CanReadAny(Index: Integer): Boolean;\r
-var\r
-  caps: Integer;\r
+function TCapability.FIsDevice : Boolean;\r
 begin\r
-  caps := PFileInfo(SELF.Objects[Index]).Capas;\r
-  Result := caps and (1 or 4 or 16) <> 0;\r
+  Result := (AnsiCompareText(Internal, 'serial') = 0);\r
 end;\r
 \r
-function TCapabilities.CanWriteAny(Index: Integer): Boolean;\r
-var\r
-  caps: Integer;\r
+function TCapability.FIsFile : Boolean;\r
 begin\r
-  caps := PFileInfo(SELF.Objects[Index]).Capas;\r
-  Result := caps and (2 or 8 or 32) <> 0;\r
+  Result := (AnsiCompareText(Internal, 'file') = 0);\r
 end;\r
 \r
-function TCapabilities.GetCaps(const Descr: string): Integer;\r
-var\r
-  info: PFileInfo;\r
-  i: Integer;\r
+function TCapability.CanReadAny : Boolean;\r
 begin\r
-  for i := 0 to Count - 1 do\r
-  begin\r
-    info := PFileInfo(Objects[i]);\r
-    if (AnsiCompareText(info.Descr, Descr) = 0) then\r
-    begin\r
-      Result := info.Capas;\r
-      Exit;\r
-    end;\r
-  end;\r
-  Result := 0;\r
+  Result := capas and (1 or 4 or 16) <> 0;\r
 end;\r
 \r
-function TCapabilities.GetDescr(Index: Integer): string;\r
-var\r
-  info: PFileInfo;\r
+function TCapability.CanWriteAny : Boolean;\r
 begin\r
-  info := PFileInfo(Objects[Index]);\r
-  Result := info.Descr;\r
-end;\r
-\r
-function TCapabilities.GetExt(const Descr: string): string;\r
-var\r
-  i: Integer;\r
-  info: PFileInfo;\r
-begin\r
-  for i := 0 to Count - 1 do\r
-  begin\r
-    info := PFileInfo(Objects[i]);\r
-    if (AnsiCompareText(info.Descr, Descr) = 0) then\r
-    begin\r
-      Result := info.Ext;\r
-      Exit;\r
-    end;\r
-  end;\r
-  Result := '.*';\r
+  Result := capas and (2 or 8 or 32) <> 0;\r
 end;\r
 \r
 function TCapabilities.GetList: TStrings;\r
@@ -512,39 +522,28 @@ begin
   Result := TStringList.Create;\r
 end;\r
 \r
-function TCapabilities.GetName(const Descr: string): string;\r
+function TCapabilities.GetCapabilityByName(const Descr: string): TCapability;\r
 var\r
   i: Integer;\r
-  info: PFileInfo;\r
+  info: TCapability;\r
 begin\r
   for i := 0 to Count - 1 do\r
   begin\r
-    info := PFileInfo(Objects[i]);\r
-    if (AnsiCompareText(info.Descr, Descr) = 0) then\r
+    info := TCapability(Objects[i]);\r
+    if (AnsiCompareText(info.Description, Descr) = 0) then\r
     begin\r
-      Result := SELF[i];\r
+      Result := info;\r
       Exit;\r
     end;\r
   end;\r
-  Result := 'unknown';\r
+  Result := nil;\r
 end;\r
 \r
-function TCapabilities.IsDevice(Index: Integer): Boolean;\r
-var\r
-  info: PFileInfo;\r
+function TCapabilities.GetCapability(Index: Integer) : TCapability;\r
 begin\r
-  info := PFileInfo(Objects[Index]);\r
-  Result := (AnsiCompareText(info.Internal, 'serial') = 0);\r
+  Result := TCapability(Objects[Index]);\r
 end;\r
 \r
-function TCapabilities.IsFile(Index: Integer): Boolean;\r
-var\r
-  info: PFileInfo;\r
-  name: string;\r
-begin\r
-  info := PFileInfo(Objects[Index]);\r
-  Result := (AnsiCompareText(info.Internal, 'file') = 0);\r
-end;\r
 \r
 procedure TCapabilities.SetList(const Value: TStrings);\r
 var\r
index c9c5261c56c35d7079026ee1baf2b17260833af4..82d2f9e6a17dc0fa8ff08addf488d6a7d2d8a666 100644 (file)
@@ -15,6 +15,9 @@ function GetStrProp(Instance: TObject; const Name: string): string; overload;
 function GetStrProp(Instance: TObject; Info: PPropInfo): string; overload;\r
 procedure SetStrProp(Instance: TObject; const Name, Value: string); overload;\r
 procedure SetStrProp(Instance: TObject; Info: PPropInfo; const Value: string); overload;\r
+\r
+function StrToBool(const str: string): Boolean;\r
+function BoolToStr(const b: Boolean; UseStrings: Boolean): string;\r
 {$ENDIF}\r
 \r
 implementation\r
@@ -88,6 +91,22 @@ begin
   TypInfo.SetStrProp(Instance, Info, Value);\r
 end;\r
 \r
+\r
+function StrToBool(const str: string): Boolean;\r
+begin\r
+  Result := (str = '1') or (LowerCase(str) = 'true') or (LowerCase(str) = 'ja')\r
+end;\r
+\r
+function BoolToStr(const b: Boolean; UseStrings: Boolean): string;\r
+const\r
+  Values: array[Boolean] of Char = ('0', '1');\r
+  SValues: array[Boolean] of string = ('false', 'true');\r
+begin\r
+  if UseStrings then\r
+    Result := SValues[b]\r
+  else\r
+    Result := Values[b];\r
+end;\r
 {$ENDIF}\r
 \r
 end.\r
index 6561c8ccab00fdb09d14b5cc55a5fb142f009bf3..873cc246c7c163a28be98b1391dc0194d6e97a83 100644 (file)
Binary files a/win32/gui-2/main.dfm and b/win32/gui-2/main.dfm differ
index c90c8a77de23e1b8b89789ad9cc47b370af64437..6e2f9de5da5ab22d18b525b7653be4b1a8aa696d 100644 (file)
@@ -181,6 +181,8 @@ type
     procedure PopupMenuPopup(Sender: TObject);\r
     procedure acOptionsSynthesizeShortNamesExecute(Sender: TObject);\r
     procedure acOptionsNukeTypesExecute(Sender: TObject);\r
+    procedure cbInputFormatExit(Sender: TObject);\r
+    procedure cbOutputFormatExit(Sender: TObject);\r
   private\r
     { Private-Deklarationen }\r
     FCaps: TCapabilities;\r
@@ -191,7 +193,7 @@ type
     FFmtIn, FFmtOut: string;\r
     procedure AddToOutput(const Str: string);\r
     procedure AddToOutputFmt(const Format: string; const Args: array of const);\r
-    procedure ComboBoxChanged(const Format: string; IsInput, IsFile: Boolean);\r
+    procedure ComboBoxChanged(Source : TComboBox; IsInput, IsFile: Boolean);\r
     procedure DoOnIdle(Sender: TObject; var Done: Boolean);\r
     procedure EnableOptions(const Version: string);\r
     function HandleOptions(const Format: string; AObject: TObject; IsInput: Boolean): Boolean;\r
@@ -336,6 +338,13 @@ begin
   cbInputLang.ItemIndex := 0;\r
   cbOutputLang.ItemIndex := 0;\r
 \r
+  cbWaypoints.Checked := StrToBool(ReadProfile(cbWaypoints.Tag));\r
+  cbTracks.Checked := StrToBool(ReadProfile(cbTracks.Tag));\r
+  cbRoutes.Checked := StrToBool(ReadProfile(cbRoutes.Tag));\r
+\r
+  acCopySelected.Enabled := False;\r
+  acSelectAll.Enabled := False;\r
+  \r
   Application.OnIdle := Self.DoOnIdle;\r
 \r
   RefreshDesign(True);\r
@@ -418,37 +427,45 @@ var
   i: Integer;\r
   OK: Boolean;\r
   s: string;\r
+  cap : TCapability;\r
 begin\r
   for i := 0 to FCaps.Count - 1 do\r
   begin\r
-    if (ForDevice and not(FCaps.IsDevice(i))) then Continue;\r
-    if not(ForDevice) and not FCaps.IsFile(i) then Continue;\r
+    cap:=FCaps.Capability[i];\r
+    if (ForDevice and not cap.IsDevice) then Continue;\r
+    if not(ForDevice) and not cap.IsFile then Continue;\r
 \r
     if (IsInput) then\r
-      OK := FCaps.CanReadAny(i)\r
+      OK := Cap.ReadAny\r
     else\r
-      OK := FCaps.CanWriteAny(i);\r
+      OK := Cap.WriteAny;\r
     if OK then\r
-      Target.Items.Add(FCaps.GetDescr(i));\r
+      Target.Items.AddObject(Cap.Description, Cap);\r
   end;\r
 \r
   s := ReadProfile(Target.Tag);\r
   ComboBoxSelect(Target, s);\r
 \r
-  ComboBoxChanged(Target.Text, IsInput, not(ForDevice));\r
+  ComboBoxChanged(Target, IsInput, not(ForDevice));\r
 end;\r
 \r
 procedure TfrmMain.OpenButtonClick(Sender: TObject);\r
 var\r
-  s: string;\r
+  s,ext: string;\r
   i: Integer;\r
+  cap : TCapability;\r
 begin\r
   dlgFileOpen.Filter := '';\r
   dlgFileOpen.DefaultExt := '*.*';\r
 \r
-  if (cbInputFormat.Text <> '') then\r
-    s := cbInputFormat.Text + '|*.' + FCaps.GetExt(cbInputFormat.Text) + '|';\r
-  s := s + _('All files|*.*');\r
+  s:='';\r
+  if (cbInputFormat.ItemIndex <> -1 ) then  begin\r
+    cap:= TCapability(cbInputFormat.Items.Objects[cbInputFormat.ItemIndex]);\r
+    ext := cap.Ext;\r
+    if (Length(ext)>0) then\r
+       s := cbInputFormat.Text + '|*.' + ext + '|';\r
+  end;\r
+  s := s + _('All files (*.*)|*.*');\r
 \r
   dlgFileOpen.Filter := s;\r
   if not SELF.dlgFileOpen.Execute then Exit;\r
@@ -466,30 +483,33 @@ begin
   CheckInput;\r
 end;\r
 \r
-procedure TfrmMain.ComboBoxChanged(const Format: string; IsInput, IsFile: Boolean);\r
+procedure TfrmMain.ComboBoxChanged(Source : TComboBox; IsInput, IsFile: Boolean);\r
 var\r
   caps: Integer;\r
   ext: string;\r
   ac: TAction;\r
+  capability : TCapability;\r
 begin\r
-  caps := FCaps.GetCaps(Format);\r
-  ext := FCaps.GetExt(Format);\r
+  if (Source.ItemIndex<0) then exit;\r
+  capability:=TCapability(Source.Items.Objects[Source.ItemIndex]);\r
+  ext := capability.Ext;\r
   if IsFile and FOutHandmade and (ext = '') then\r
   begin\r
     ext := SysUtils.ExtractFileExt(edOutputFile.Text);\r
     if (ext <> '') and (ext[1] = '.') then Delete(ext, 1, 1);\r
   end;\r
 \r
+  caps := capability.Capas;\r
   if IsInput then\r
   begin\r
-    FFmtIn := Format;\r
+    FFmtIn := capability.Name;\r
     wptInputOK.Enabled := (caps and 1 <> 0);\r
     trkInputOK.Enabled := (caps and 4 <> 0);\r
     rteInputOK.Enabled := (caps and 16 <> 0);\r
   end\r
     else\r
   begin\r
-    FFmtOut := Format;\r
+    FFmtOut := capability.Name;\r
     wptOutputOK.Enabled := (caps and 2 <> 0);\r
     trkOutputOK.Enabled := (caps and 8 <> 0);\r
     rteOutputOK.Enabled := (caps and 32 <> 0);\r
@@ -508,7 +528,7 @@ begin
     edInputOpts.Items.Clear;\r
     \r
     ac := acOptionsSourceFormat;\r
-    acOptionsSourceFormat.Caption := _('Input') + ': ' + Format;\r
+    acOptionsSourceFormat.Caption := _('Input') + ': ' + capability.Name;\r
     btnInputOpts.Caption := '';\r
   end\r
   else begin\r
@@ -516,18 +536,18 @@ begin
     edOutputOpts.Items.Clear;\r
 \r
     ac := acOptionsTargetFormat;\r
-    acOptionsTargetFormat.Caption := _('Output') + ': ' + Format;\r
+    acOptionsTargetFormat.Caption := _('Output') + ': ' + capability.Name;\r
     btnOutputOpts.Caption := '';\r
   end;\r
 \r
-  ac.Enabled := FOpts.HasFormatOpts(Format);\r
+  ac.Enabled := FOpts.HasFormatOpts(capability);\r
   if ac.Enabled then\r
   begin\r
-    ac.Hint := SysUtils.Format(_('Select and edit options for "%s"'), [Format]);\r
+    ac.Hint := SysUtils.Format(_('Select and edit options for "%s"'), [capability.Name]);\r
   end\r
     else\r
   begin\r
-    ac.Hint := SysUtils.Format(_('No options available for "%s"'), [Format]);\r
+    ac.Hint := SysUtils.Format(_('No options available for "%s"'), [capability.Name]);\r
   end;\r
 end;\r
 \r
@@ -583,12 +603,16 @@ end;
 procedure TfrmMain.sbSaveFileClick(Sender: TObject);\r
 var\r
   s: string;\r
+  cap : TCapability;\r
 begin\r
   dlgFileSave.Filter := '';\r
   dlgFileSave.DefaultExt := '*.*';\r
 \r
-  if (cbOutputFormat.Text <> '') then\r
-    s := cbOutputFormat.Text + '|*.' + FCaps.GetExt(cbOutputFormat.Text) + '|';\r
+  s:='';\r
+  if (cbOutputFormat.ItemIndex <> -1) then begin\r
+    cap:=FCaps.Capability[cbOutputFormat.ItemIndex];\r
+    s := Format('%s|%s',[cbOutputFormat.Text,cap.Ext,cap.Ext]);\r
+  end;\r
   s := s + _('All files|*.*');\r
 \r
   dlgFileSave.Filter := s;\r
@@ -609,7 +633,7 @@ var
   IFormat, OFormat, IFiles: string;\r
   Fatal: Boolean;\r
   sp: PChar;\r
-\r
+  cap : TCapability;\r
 begin\r
   acLetsGo.Enabled := False;\r
   try\r
@@ -619,14 +643,16 @@ begin
     if gpsbabel_knows_inifile then cmdline := '-p ""';\r
 \r
     if chbInputDevice.Checked then\r
-      IFormat := FCaps.GetName(cbInputFormatDevice.Text)\r
+      cap:= TCapability(cbInputFormatDevice.Items.Objects[cbInputFormatDevice.ItemIndex])\r
     else\r
-      IFormat := FCaps.GetName(cbInputFormat.Text);\r
+      cap:= TCapability(cbInputFormat.Items.Objects[cbInputFormat.ItemIndex]);\r
+    IFormat :=cap.Name;\r
+\r
     if chbOutputDevice.Checked then\r
-      OFormat := FCaps.GetName(cbOutputFormatDevice.Text)\r
+      cap:= TCapability(cbOutputFormatDevice.Items.Objects[cbOutputFormatDevice.ItemIndex])\r
     else\r
-      OFormat := FCaps.GetName(cbOutputFormat.Text);\r
-\r
+      cap:= TCapability(cbOutputFormat.Items.Objects[cbOutputFormat.ItemIndex]);\r
+    OFormat := cap.Name;\r
     if cbWaypoints.Checked then cmdline := cmdline + ' -w';\r
     if cbRoutes.Checked then cmdline := cmdline + ' -r';\r
     if cbTracks.Checked then cmdline := cmdline + ' -t';\r
@@ -958,7 +984,9 @@ begin
   StoreProfile(cbOutputDevice.Tag, cbOutputDevice.Text);\r
   StoreProfile(cbOutputFormatDevice.Tag, cbOutputFormatDevice.Text);\r
   StoreProfile(edInputFile.Tag, edInputFile.Text);\r
-  StoreProfile(edOutputFile.Tag, edOutputFile.Text);\r
+  StoreProfile(cbWayPoints.Tag, BoolToStr(cbWayPoints.Checked,true));\r
+  StoreProfile(cbRoutes.Tag, BoolToStr(cbRoutes.Checked,true));\r
+  StoreProfile(cbTracks.Tag, BoolToStr(cbTracks.Checked,true));\r
 end;\r
 \r
 procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);\r
@@ -986,7 +1014,7 @@ begin
     cbOutputFormat.Visible := True;\r
     sbSaveFile.Visible := True;\r
     edOutputFile.Visible := True;\r
-   cbOutputDevice.Visible := False;\r
+    cbOutputDevice.Visible := False;\r
     cbOutputFormatDevice.Visible := False;\r
     lbOutputFile.Caption := _('File');\r
     FFmtOut := cbOutputFormat.Text;\r
@@ -1012,22 +1040,32 @@ end;
 \r
 procedure TfrmMain.cbInputFormatDeviceChange(Sender: TObject);\r
 begin\r
-  ComboBoxChanged(cbInputFormatDevice.Text, True, False);\r
+  ComboBoxChanged(cbInputFormatDevice, True, False);\r
+end;\r
+\r
+procedure TfrmMain.cbInputFormatExit(Sender: TObject);\r
+begin\r
+  if (cbInputFormat.ItemIndex=-1) then cbInputFormat.ItemIndex:=0;\r
 end;\r
 \r
 procedure TfrmMain.cbOutputFormatDeviceChange(Sender: TObject);\r
 begin\r
-  ComboBoxChanged(cbOutputFormatDevice.Text, False, False);\r
+  ComboBoxChanged(cbOutputFormatDevice, False, False);\r
+end;\r
+\r
+procedure TfrmMain.cbOutputFormatExit(Sender: TObject);\r
+begin\r
+  if (cbOutputFormat.ItemIndex=-1) then cbOutputFormat.ItemIndex:=0;\r
 end;\r
 \r
 procedure TfrmMain.cbInputFormatChange(Sender: TObject);\r
 begin\r
-  ComboBoxChanged(cbInputFormat.Text, True, True);\r
+  ComboBoxChanged(cbInputFormat, True, True);\r
 end;\r
 \r
 procedure TfrmMain.cbOutputFormatChange(Sender: TObject);\r
 begin\r
-  ComboBoxChanged(cbOutputFormat.Text, False, True);\r
+  ComboBoxChanged(cbOutputFormat, False, True);\r
 end;\r
 \r
 procedure TfrmMain.acOptionsSourceFormatExecute(Sender: TObject);\r
@@ -1323,6 +1361,9 @@ var
                   _translate(GPSBabel_Domain, MsgID) + '"');\r
   end;\r
 \r
+var\r
+  cap : TCapability;\r
+\r
 begin\r
   if not SelectLanguage(\r
     _('Choose language') + ' ' + _('for export'),\r
@@ -1359,10 +1400,11 @@ begin
 \r
       for i := 0 to FCaps.Count - 1 do\r
       begin\r
-        if not FCaps.IsFile(i) then Continue;\r
+        cap:=FCaps.Capability[i];\r
+        if not Cap.IsFile then Continue;\r
 \r
-        s := FCaps.GetDescr(i);\r
-        UniWrite(f, Format('format:%s,', [FCaps.GetName(s)]));\r
+        s := Cap.Description;\r
+        UniWrite(f, Format('format:%s,', [Cap.Name]));\r
         UniWriteLn(f, '"' + s + '","' + _translate(GPSBabel_Domain, s) + '"');\r
 \r
         l := FOpts.FormatOpts(s);\r
@@ -1418,12 +1460,14 @@ procedure TfrmMain.acSelectAllExecute(Sender: TObject);
 begin\r
   memoOutput.SetFocus;\r
   memoOutput.SelectAll;\r
+  acSelectAll.Enabled := False;\r
 end;\r
 \r
 procedure TfrmMain.acCopySelectedExecute(Sender: TObject);\r
 begin\r
   memoOutput.SetFocus;\r
   memoOutput.CopyToClipboard;\r
+  acCopySelected.Enabled := False;\r
 end;\r
 \r
 procedure TfrmMain.PopupMenuPopup(Sender: TObject);\r
@@ -1432,8 +1476,9 @@ begin
   pmnuCopySelected.Caption := dgettext('delphi', pmnuCopySelected.Caption);\r
   pmnuClearOutput.Caption := dgettext('delphi', pmnuClearOutput.Caption);\r
   \r
-  pmnuSelectAll.Enabled := (memoOutput.Lines.Count > 0);\r
-  pmnuCopySelected.Enabled := (memoOutput.Lines.Count > 0);\r
+  acSelectAll.Enabled := (memoOutput.Lines.Count > 0);\r
+  acCopySelected.Enabled := (memoOutput.Lines.Count > 0);\r
+\r
   pmnuClearOutput.Enabled := (memoOutput.Lines.Count > 0);\r
 end;\r
 \r
index 5979d16d3f2d251183b5ff008d6d13a731379baf..f90744526139514e42373cdb3ac1694f9046070c 100644 (file)
@@ -46,13 +46,9 @@ type
     FOpts: TStringList;\r
     FCanvas: TCanvas;\r
     FInitialOpts: string;\r
-    procedure CreateStringOption(const x, y, tag: Integer; o: POption; xmax: Integer = -1);\r
     procedure CreateIntegerOption(const x, y, tag: Integer; o: POption; xmax: Integer = -1);\r
-    procedure CreateFileOption(const x, y, tag: Integer; o: POption; IsInput: Boolean; xmax: Integer = -1);\r
     function FindUpDown(AControl: TControl): TUpDown;\r
     function GetOptsStr: string;\r
-    procedure OptionOpenFile(Sender: TObject);\r
-    procedure OptionSaveFile(Sender: TObject);\r
     function ParseOptsLine(const Line: string; List: TStrings): Integer;\r
     procedure SetOpts(AList: TStringList);\r
     procedure SetOptsStr(const AValue: string);\r
@@ -64,15 +60,72 @@ type
     FFormat: string;\r
     FIsInput: Boolean;\r
     constructor Create(AOwner: TComponent); override;\r
+    destructor Destroy; override;\r
   property\r
     Opts: TStringList read FOpts write SetOpts;\r
     property OptsStr: string read GetOptsStr write SetOptsStr;\r
   end;\r
 \r
+  TIntegerEdit = class(TOptionEdit)\r
+  protected\r
+    ed: TEdit;\r
+    up: TUpDown;\r
+    max, min : Integer;\r
+    function GetValue : String; override;\r
+    procedure SetValue(Value : String); override;\r
+    function GetEnabled : Boolean; override;\r
+    procedure SetEnabled(value : Boolean); override;\r
+    procedure UpDownClick(Sender: TObject; Button: TUDBtnType);\r
+    function GetIntValue : Integer;\r
+    procedure SetIntValue(Value : Integer);\r
+  public\r
+    constructor Create(Form : TForm; Parent : TWinControl; AOption : POption; const x,y : Integer);\r
+  end;\r
+\r
+  TIntegerSelectEdit = class(TOptionEdit)\r
+  protected\r
+    combo: TComboBox;\r
+    min : Integer;\r
+    function GetValue : String; override;\r
+    procedure SetValue(Value : String); override;\r
+    function GetEnabled : Boolean; override;\r
+    procedure SetEnabled(value : Boolean); override;\r
+  public\r
+    constructor Create(Form : TForm; Parent : TWinControl; AOption : POption; const x,y,xmax : Integer);\r
+  end;\r
+\r
+  TStringEdit = class(TOptionEdit)\r
+  protected\r
+    ed: TEdit;\r
+    function GetValue : String; override;\r
+    procedure SetValue(Value : String); override;\r
+    function GetEnabled : Boolean; override;\r
+    procedure SetEnabled(value : Boolean); override;\r
+  public\r
+    constructor Create(Form : TForm; Parent : TWinControl; AOption : POption; const x,y : Integer);\r
+  end;\r
+\r
+  TFileEdit = class(TOptionEdit)\r
+  protected\r
+    ed: TEdit;\r
+    btn: TSpeedButton;\r
+    FForm : TfrmOptions;\r
+    FIsInput : Boolean;\r
+    function GetValue : String; override;\r
+    procedure SetValue(Value : String); override;\r
+    function GetEnabled : Boolean; override;\r
+    procedure SetEnabled(value : Boolean); override;\r
+    procedure OpenFile(Sender: TObject);\r
+    procedure SaveFile(Sender: TObject);\r
+  public\r
+    constructor Create(AForm : TfrmOptions; Parent : TWinControl; AOption : POption;\r
+      const x,y : Integer; AIsInput: Boolean; xmax: Integer = -1);\r
+  end;\r
+\r
 type\r
   eUnknownOption = class(Exception);\r
   eParserError = class(Exception);\r
-  \r
+\r
 var\r
   frmOptions: TfrmOptions;\r
 \r
@@ -138,6 +191,233 @@ begin
   end;\r
 end;\r
 \r
+constructor TIntegerEdit.Create;\r
+begin\r
+  FOption:=AOption;\r
+  ed:=TEdit.Create(form);\r
+  ed.Parent:=Parent;\r
+  up:=TUpDown.Create(form);\r
+  up.Parent:=Parent;\r
+\r
+  // The following initialization will allow users\r
+  // to decrease or increase max 16383 times before\r
+  // TUpDown blocks - if a user will every reach that limit?\r
+  up.Min := 0;\r
+  up.Max := MAXSHORT;\r
+  up.Position:=MAXSHORT DIV 2;\r
+\r
+  ed.Left := x;\r
+  ed.Top := y;\r
+\r
+  ed.Width := ed.Width - up.Width;\r
+  up.Left := ed.Left + ed.Width;\r
+  up.Top := ed.Top;\r
+\r
+  if (Option.min <> nil) then\r
+    min := StrToInt(Option.min)\r
+  else\r
+    min := -(MAXLONG-1);\r
+  if (Option.max <> nil) then\r
+    max := StrToInt(Option.max)\r
+  else\r
+    max := MAXLONG;\r
+  if (Option.def <> nil) then\r
+    Value:=Option.def;\r
+  up.OnClick:=UpDownClick;\r
+end;\r
+\r
+procedure TIntegerEdit.UpDownClick(Sender: TObject; Button: TUDBtnType);\r
+begin\r
+  if (Button = btNext) then\r
+    SetIntValue(GetIntValue+1)\r
+  else\r
+    SetIntValue(GetIntValue-1);\r
+end;\r
+\r
+procedure TIntegerEdit.SetIntValue(Value : Integer);\r
+begin\r
+  if (Value <min) or (value >max) then exit;\r
+  ed.Text:=InttoStr(Value);\r
+end;\r
+\r
+function TIntegerEdit.GetIntValue : Integer;\r
+begin\r
+  Result:=StrToIntDef(ed.Text,0);\r
+end;\r
+\r
+function TIntegerEdit.GetValue : String;\r
+begin\r
+  Result:=InttoStr(GetIntValue);\r
+end;\r
+\r
+procedure TIntegerEdit.SetValue(Value : String);\r
+begin\r
+  SetIntValue(StrToIntDef(value,Min));\r
+end;\r
+\r
+function TIntegerEdit.GetEnabled : Boolean;\r
+begin\r
+  result:=ed.Enabled;\r
+end;\r
+\r
+procedure TIntegerEdit.SetEnabled(value : Boolean);\r
+begin\r
+  ed.Enabled:=Value;\r
+  up.Enabled:=Value;\r
+end;\r
+\r
+//*******************************************++\r
+\r
+constructor TIntegerSelectEdit.Create;\r
+Var\r
+  I : Integer;\r
+begin\r
+  FOption:=AOption;\r
+  Combo := TComboBox.Create(Form);\r
+  Combo.Left := x;\r
+  Combo.Top := y;\r
+  if (Combo.Left + Combo.Width < xmax) then\r
+    Combo.Left := xmax - Combo.Width;\r
+  Combo.Parent := Parent;\r
+  min:=StrToInt(Option.min);\r
+  for i := min to StrToInt(Option.max) do\r
+    Combo.Items.Add(IntToStr(i));\r
+  if (Option.def <> nil) then\r
+    Combo.Text := Option.def\r
+  else\r
+    Combo.ItemIndex := 0;\r
+end;\r
+\r
+function TIntegerSelectEdit.GetValue : String;\r
+begin\r
+  Result:=InttoStr(Min + Combo.ItemIndex);\r
+end;\r
+\r
+procedure TIntegerSelectEdit.SetValue(Value : String);\r
+Var\r
+  I : Integer;\r
+begin\r
+  I:=StrToIntDef(Value,Min);\r
+  I:=I-Min;\r
+  Combo.ItemIndex:=I;\r
+end;\r
+\r
+function TIntegerSelectEdit.GetEnabled : Boolean;\r
+begin\r
+  Result:=Combo.Enabled;\r
+end;\r
+\r
+procedure TIntegerSelectEdit.SetEnabled(value : Boolean);\r
+begin\r
+  Combo.Enabled:=Value;\r
+end;\r
+\r
+constructor TStringEdit.Create;\r
+begin\r
+  FOption:=AOption;\r
+  ed := TEdit.Create(form);\r
+  ed.Left := x;\r
+  ed.Top := y;\r
+  if (Option.def <> nil) then\r
+    Value := string(Option.def);\r
+  ed.Parent := Parent;\r
+end;\r
+\r
+function TStringEdit.GetValue : String;\r
+begin\r
+  Result:=ed.Text;\r
+end;\r
+\r
+procedure TStringEdit.SetValue(Value : String);\r
+begin\r
+  ed.Text:=Value;\r
+end;\r
+\r
+function TStringEdit.GetEnabled : Boolean;\r
+begin\r
+  Result:=ed.Enabled;\r
+end;\r
+\r
+procedure TStringEdit.SetEnabled(value : Boolean);\r
+begin\r
+  ed.Enabled:=Value;\r
+end;\r
+\r
+constructor TFileEdit.Create;\r
+begin\r
+  FOption:=AOption;\r
+  FForm:=AForm;\r
+  FIsInput:=AIsInput;\r
+  ed := TEdit.Create(FForm);\r
+\r
+  ed.Left := x;\r
+  ed.Top := y;\r
+  ed.Parent := Parent;\r
+\r
+  btn := TSpeedButton.Create(FForm);\r
+  btn.Parent := Parent;\r
+  ed.Width := ed.Width - btn.Width;\r
+  btn.Left := ed.Left + ed.Width;\r
+  btn.Top := ed.top;\r
+\r
+  if FIsInput then begin\r
+    frmMain.ImageList1.GetBitmap(15, btn.Glyph);\r
+    btn.OnClick := OpenFile;\r
+  end else begin\r
+    frmMain.ImageList1.GetBitmap(17, btn.Glyph);\r
+    btn.OnClick := SaveFile;\r
+  end;\r
+end;\r
+\r
+procedure TFileEdit.OpenFile(Sender: TObject);\r
+var\r
+  d: TOpenDialog;\r
+begin\r
+  d := TOpenDialog.Create(FForm);\r
+  try\r
+    d.FileName := Value;\r
+    if d.Execute then\r
+      Value:=d.FileName;\r
+  finally\r
+    d.Free;\r
+  end;\r
+end;\r
+\r
+procedure TFileEdit.SaveFile(Sender: TObject);\r
+var\r
+  d: TSaveDialog;\r
+begin\r
+  d := TSaveDialog.Create(FForm);\r
+  try\r
+    d.FileName := Value;\r
+    if d.Execute then\r
+      Value:=d.FileName;\r
+  finally\r
+    d.Free;\r
+  end;\r
+end;\r
+\r
+function TFileEdit.GetEnabled : Boolean;\r
+begin\r
+  Result:=ed.Enabled;\r
+end;\r
+\r
+procedure TFileEdit.SetEnabled(value : Boolean);\r
+begin\r
+  ed.Enabled:=Value;\r
+  btn.Enabled:=Value;\r
+end;\r
+\r
+function TFileEdit.GetValue : String;\r
+begin\r
+  Result:=ed.Text;\r
+end;\r
+\r
+procedure TFileEdit.SetValue(Value : String);\r
+begin\r
+  ed.Text:=value;\r
+end;\r
+\r
 { TfrmOptions }\r
 \r
 constructor TfrmOptions.Create(AOwner: TComponent); // override;\r
@@ -205,7 +485,7 @@ begin
     o.chb := chb;\r
     chb.Name := '___' + o.name;\r
     chb.OnClick := CheckBoxClicked;\r
-    chb.Tag := i + 1;\r
+    chb.Tag := i;\r
 \r
     InsertComponent(chb);\r
 \r
@@ -237,6 +517,8 @@ begin
       chb.AllowGrayed := True;\r
       chb.State := cbGrayed;\r
     end;\r
+    if (Assigned(o.edit)) and (chb.checked) then\r
+      o.edit.Enabled:=True;\r
   end;\r
 \r
   xy.y := 8;\r
@@ -253,10 +535,10 @@ begin
     // ('unknown', 'integer', 'float', 'string', 'boolean', 'file', 'outfile');\r
     case o.otype of\r
       1: CreateIntegerOption(xy.X, xy.Y - 2, i + 1, o, xmax);\r
-      2, 3: CreateStringOption(xy.X, xy.Y - 2, i + 1, o, xmax);\r
+      2, 3:   o.edit:=TStringEdit.Create(self,pnOptions,o,xy.X, xy.Y - 2);\r
       4: ;\r
-      5: CreateFileOption(xy.X, xy.Y - 2, i + 1, o, True, xmax);\r
-      6: if not FIsInput then CreateFileOption(xy.X, xy.Y - 2, i + 1, o, False, xmax);\r
+      5: o.edit:=TFileEdit.Create(self,pnOptions,o,xy.X, xy.Y - 2, True, xmax);\r
+      6: if not FIsInput then o.edit:=TFileEdit.Create(self,pnOptions,o,xy.X, xy.Y - 2, False, xmax);\r
     end;\r
     if (o.edit <> nil) then\r
       o.edit.Enabled := False;\r
@@ -324,7 +606,7 @@ begin
         Result := Result + '=0';\r
       Continue;\r
     end;\r
-    s := GetStrProp(o.edit, 'Text');\r
+    s := o.edit.value;\r
     if (Pos(' ', s) <> 0) or (Pos('"', s) <> 0) or (Pos(',', s) <> 0) then\r
       s := SysUtils.AnsiQuotedStr(s, '"');\r
     Result := SysUtils.Format('%s=%s', [Result, s]);\r
@@ -383,11 +665,8 @@ begin
       if (o.edit <> nil) then\r
       begin\r
         o.chb.Checked := True;\r
-        ud := FindUpDown(o.Edit);\r
-        if (ud <> nil) then\r
-          ud.Position := StrToInt(Value)\r
-        else\r
-          SetStrProp(o.edit, 'Text', Value);\r
+        o.Edit.Enabled:=True;\r
+        o.Edit.Value:=Value;\r
       end\r
       else if (o.otype = 4) then\r
         o.chb.Checked := (value = '') or (value <> '0');\r
@@ -400,38 +679,15 @@ end;
 \r
 procedure TfrmOptions.CheckBoxClicked(Sender: TObject);\r
 var\r
-  i: Integer;\r
-  c: TComponent;\r
   chb: TCheckBox;\r
-  ctrl: TWinControl;\r
+  o : POption; \r
 begin\r
   if (Sender = nil) or not (Sender is TCheckBox) then Exit;\r
   chb := Pointer(Sender);\r
-\r
-  for i := 0 to ComponentCount - 1 do\r
-  begin\r
-    c := Components[i];\r
-    if (c = chb) or not(c.InheritsFrom(TWinControl)) then Continue;\r
-    if (c.Tag <> chb.Tag) then Continue;\r
-    ctrl := Pointer(c);\r
-    ctrl.Enabled := chb.Checked;\r
-  end;\r
-end;\r
-\r
-procedure TfrmOptions.CreateStringOption(const x, y, tag: Integer; o: POption; xmax: Integer);\r
-var\r
-  ed: TEdit;\r
-begin\r
-  ed := TEdit.Create(Self);\r
-  o.edit := ed;\r
-\r
-  ed.Left := x;\r
-  ed.Top := y;\r
-  ed.Tag := tag;\r
-  ed.Parent := pnOptions;\r
-\r
-  if (o.def <> nil) then\r
-    ed.Text := string(o.def);\r
+  o:=POption(FOpts.Objects[chb.tag]);\r
+  if not Assigned(o) Then exit;\r
+  if not Assigned(o^.edit) Then exit;\r
+  o^.edit.Enabled:=chb.Checked;\r
 end;\r
 \r
 procedure TfrmOptions.CreateIntegerOption(const x, y, tag: Integer; o: POption; xmax: Integer);\r
@@ -443,50 +699,9 @@ var
 begin\r
   if (o.min <> nil) and (o.max <> nil) and\r
      ((StrToInt(o.max) - StrToInt(o.min)) < 32) then\r
-  begin\r
-    cb := TComboBox.Create(Self);\r
-    o.edit := cb;\r
-    cb.Left := x;\r
-    cb.Top := y;\r
-    cb.Tag := tag;\r
-    if (cb.Left + cb.Width < xmax) then\r
-      cb.Left := xmax - cb.Width;\r
-    cb.Parent := pnOptions;\r
-\r
-    for i := StrToInt(o.min) to StrToInt(o.max) do\r
-      cb.Items.Add(IntToStr(i));\r
-    if (o.def <> nil) then\r
-      cb.Text := o.def\r
-    else\r
-      cb.ItemIndex := 0;\r
-    Exit;\r
-  end;\r
-\r
-  ed := TEdit.Create(Self);\r
-  o.edit := ed;\r
-\r
-  ed.Left := x;\r
-  ed.Top := y;\r
-  ed.Tag := tag;\r
-  ed.Parent := pnOptions;\r
-\r
-  up := TUpDown.Create(Self);\r
-  up.Parent := pnOptions;\r
-\r
-  ed.Width := ed.Width - up.Width;\r
-  up.Left := ed.Left + ed.Width;\r
-  up.Top := ed.Top;\r
-  if (o.min <> nil) then\r
-    up.Min := StrToInt(o.min)\r
-  else\r
-    up.Min := -(MAXSHORT-1);\r
-  if (o.max <> nil) then\r
-    up.Max := StrToInt(o.max)\r
+     o.edit:=TIntegerSelectEdit.Create(self,pnOptions,o,x,y,xmax)\r
   else\r
-    up.Max := MAXSHORT;\r
-  if (o.def <> nil) then\r
-    up.Position := StrToInt(o.def);\r
-  up.Associate := ed;\r
+    o.edit:=TIntegerEdit.Create(self,pnOptions,o,x,y);\r
 end;\r
 \r
 procedure TfrmOptions.FormCreate(Sender: TObject);\r
@@ -500,93 +715,6 @@ begin
   WinOpenURL(readme_html_path + '#fmt_' + FFormat);\r
 end;\r
 \r
-procedure TfrmOptions.CreateFileOption(const x, y, tag: Integer;\r
-  o: POption; IsInput: Boolean; xmax: Integer = -1);\r
-var\r
-  ed: TEdit;\r
-  btn: TSpeedButton;\r
-begin\r
-  ed := TEdit.Create(Self);\r
-  o.edit := ed;\r
-\r
-  ed.Left := x;\r
-  ed.Top := y;\r
-  ed.Tag := tag;\r
-  ed.Parent := pnOptions;\r
-\r
-  btn := TSpeedButton.Create(Self);\r
-  btn.Parent := pnOptions;\r
-  btn.Tag := tag;\r
-  ed.Width := ed.Width - btn.Width;\r
-  btn.Left := ed.Left + ed.Width;\r
-  btn.Top := ed.top;\r
-\r
-  if IsInput then\r
-  begin\r
-    btn.OnClick := Self.OptionOpenFile;\r
-    frmMain.ImageList1.GetBitmap(15, btn.Glyph);\r
-  end\r
-    else\r
-  begin\r
-    btn.OnClick := Self.OptionSaveFile;\r
-    frmMain.ImageList1.GetBitmap(17, btn.Glyph);\r
-  end;\r
-end;\r
-\r
-procedure TfrmOptions.OptionOpenFile(Sender: TObject);\r
-var\r
-  c: TControl;\r
-  i: Integer;\r
-  o: POption;\r
-  d: TOpenDialog;\r
-begin\r
-  if (Sender = nil) or not(Sender is TControl) then Exit;\r
-\r
-  c := Pointer(Sender);\r
-\r
-  for i := 0 to FOpts.Count - 1 do\r
-  begin\r
-    o := Pointer(FOpts.Objects[i]);\r
-    if (o.chb = nil) or (o.chb.Tag <> c.Tag) then Continue;\r
-\r
-    d := TOpenDialog.Create(Self);\r
-    try\r
-      d.FileName := GetStrProp(o.edit, 'Text');\r
-      if d.Execute then\r
-        SetStrProp(o.edit, 'Text', d.FileName);\r
-    finally\r
-      d.Free;\r
-    end;\r
-  end;\r
-end;\r
-\r
-procedure TfrmOptions.OptionSaveFile(Sender: TObject);\r
-var\r
-  c: TControl;\r
-  i: Integer;\r
-  o: POption;\r
-  d: TSaveDialog;\r
-begin\r
-  if (Sender = nil) or not(Sender is TControl) then Exit;\r
-  \r
-  c := Pointer(Sender);\r
-\r
-  for i := 0 to FOpts.Count - 1 do\r
-  begin\r
-    o := Pointer(FOpts.Objects[i]);\r
-    if (o.chb = nil) or (o.chb.Tag <> c.Tag) then Continue;\r
-\r
-    d := TSaveDialog.Create(Self);\r
-    try\r
-      d.FileName := GetStrProp(o.edit, 'Text');\r
-      if d.Execute then\r
-        SetStrProp(o.edit, 'Text', d.FileName);\r
-    finally\r
-      d.Free;\r
-    end;\r
-  end;\r
-end;\r
-\r
 function TfrmOptions.ParseOptsLine(const Line: string; List: TStrings): Integer;\r
 var\r
   s, name, val: string;\r
@@ -779,7 +907,7 @@ begin
         else\r
           value := '0';\r
       end\r
-        else value := GetStrProp(o.edit, 'Text');\r
+        else value := o.edit.Value;\r
       if (o.gbdef <> nil) and (StrPas(o.gbdef) = value) then\r
         r.WriteString(key, '(default)')\r
       else\r
@@ -829,17 +957,7 @@ begin
       begin\r
         o.chb.Checked := True;\r
         if (value <> '(default)') then\r
-        begin\r
-          if HasUpDown(TEdit(o.edit), u) then\r
-          begin\r
-            if (o.def <> nil) then\r
-              v := StrToIntDef(o.def, 0) else\r
-              v := 0;\r
-            u.Position := StrToIntDef(value, v);\r
-          end\r
-          else\r
-            SetStrProp(o.edit, 'Text', value);\r
-        end;\r
+           o.edit.Value := value;\r
         o.edit.Enabled := True;\r
       end;\r
     end;\r
@@ -859,4 +977,23 @@ begin
   StoreBounds('options_form', Self);\r
 end;\r
 \r
+destructor TfrmOptions.Destroy;\r
+Var\r
+  I : Integer;\r
+  o: POption;\r
+begin\r
+  try\r
+    for i := 0 to FOpts.Count - 1 do\r
+    begin\r
+      o := Pointer(FOpts.Objects[i]);\r
+      if (Assigned(o.edit)) then begin\r
+        o.edit.Free;\r
+        o.edit := nil;\r
+      end;\r
+    end;\r
+  finally\r
+    inherited;\r
+  end;\r
+end;\r
+\r
 end.\r